package Gather.StreamExercise.MethodReference.MethodDome;

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Predicate;

/**
 * ClassName:MethodReference003
 * Package:Gather.StreamExercise.MethodReference
 * Description:
 *
 * @Author:ZhangXin
 * @Create2023/2/25-13:51
 * @Version:v1.0
 */
public class MethodReference003 {
    //2.引用成员方法
    //   格式：对象::成员方法
    //   a.其他类：其他类对象::方法
    //   b.本类：this::方法名
    //   c.父类：super::方法名

    /*需求
     * 集合中有一些名字,按照要求过滤数据
     * 数据："张无忌","周芷若","赵敏","张强","张三丰"
     * 要求：只要以张开头,而且名字是3个字的*/
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰");
        list.stream()
                .filter(s -> (s.startsWith("张") && s.length() == 3))
                .forEach(s -> System.out.println(s));

        //FunctionalInterface
        list.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.startsWith("张") && s.length() == 3;
            }
        }).forEach(s -> System.out.println(s));

        //成员方法引用  其他类：其他类对象::方法
        list.stream()
                .filter(new StringOperation()::stringJudge)
                .forEach(s -> System.out.println(s));


        //b.本类：this::方法名
        //静态方法中没有this则需要创建本类对象进行引用
        list.stream()
                .filter(new MethodReference003()::stringJudge)
                .forEach(s -> System.out.println(s));
    }

    public boolean stringJudge(String s){
        return s.startsWith("张") && s.length() == 3;
    }
}
